package i18n

import (
	"sync"
	"sync/atomic"
)

var (
	defaultBundle     = new(atomic.Pointer[Bundle])
	defaultBundleOnce sync.Once
	defaultLocalizer  = new(atomic.Value)
	defaultLocalOnce  sync.Once
)

// GetDefaultBundle 获取默认的多语言包管理器
//   - 首次调用时, 如为用户设置默认的多语言包管理器，则自动初始化一个新的多语言包管理器
//   - 该管理器无默认语言的空语言包管理器
func GetDefaultBundle() *Bundle {
	if v := defaultBundle.Load(); v != nil {
		return v
	}
	defaultBundleOnce.Do(func() {
		b := NewBundle()
		b.isDefault = true
		defaultBundle.Store(b)
	})
	return defaultBundle.Load()
}

// SetDefaultBundle 设置默认的多语言包管理器
func SetDefaultBundle(b *Bundle) {
	if b == nil {
		return
	}
	defaultBundle.Store(b)
}

// GetDefaultLocalizer 获取针对默认的多语言包管理器的默认语言本地化器
//   - 修改默认语言设置时会自动更新该默认本地化器
func GetDefaultLocalizer() Localizer {
	if v := defaultLocalizer.Load(); v != nil {
		return v.(Localizer)
	}
	defaultLocalOnce.Do(func() {
		loc := NewLocalizer(GetDefaultBundle().GetDefaultLang())
		defaultLocalizer.Store(loc)
	})
	return defaultLocalizer.Load().(Localizer)
}

// SetDefaultLocalizer 设置针对默认的多语言包管理器的默认语言本地化器
func SetDefaultLocalizer(loc Localizer) {
	if loc == nil {
		return
	}
	defaultLocalizer.Store(loc)
}
